// 本接口使用示例：
// import { SDK } from './sdk.js';
// var req = {
//   username: 'admin',
//   password: 'admin'
// }
// SDK.Login(req).then(successRes => {
//   // 成功回复
// }, err => {
//   // 失败恢复
// })

var nuid = require("nuid"); // 自己通过npm安装
import md5 from "js-md5"; // 自己通过npm安装
var nats = require('./websocket-nats/index.js')

var hostname = window.location.hostname
if (process.env.NODE_ENV != 'production') {
  hostname = '192.168.30.88' // 调试设备的IP地址
}
var timeout = 1500; // 请求超时时间

function NatsApi() {
  // 推送
  this.Publish = function (uri, req, callback) {
    var sid = this.conn.publish(uri, req, function (msg) {
      callback(msg)
    }.bind(this))
  }

  // 连接
  this.CreatConnect = function (optin) {
    return new Promise(function (resolve, reject) {
      var host = ''
      if (optin && optin.url) {
        host = optin.url
      } else {
        host = hostname
      }
      this.conn = nats.connect({
        reconnect: false,
        url: 'ws://' + host + ':8080/_ws/stbp'
      }, function (res) {
        resolve('success')
      }, function (res) {
        reject('fail');
      })
      setTimeout(function () {
        reject('timeout');
      }, 3000)
    }.bind(this));
  }
  // 断开连接
  this.DisConnect = function () {
    try {
      if (this.conn) {
        this.conn.close()
        this.conn = null
      }
    } catch (err) {
      console.warn('Close Connection Error!', err);
    }
  }
  // 订阅
  this.Subscribe = function (topic, callback) {
    var sid = this.conn.subscribe(topic, function (msg) {
      callback(msg)
      console.log('msg:', msg)
    }.bind(this))
  }
  // 取消订阅
  this.Unsubscribe = function (topic) {
    this.conn.unsubscribe(topic)
  }
  // 发送请求
  this.onRequest = function (subject, opt_msg, opt_options, clientId, callback) {
    return new Promise(function (resolve, reject) {
      this.conn.request(subject, opt_msg, opt_options, clientId, function (msg, reply) {
        resolve(msg)
        if (typeof (callback) == 'function') {
          callback(msg, reply)
        }
      }.bind(this));
      setTimeout(function () {
        reject('timeout');
      }, 5000)
    }.bind(this));
  }
  this.isConnected = function () {
    if (this && this.conn && this.conn.isConnected()) {
      return true
    } else {
      return false
    }
  }
}

var api = new NatsApi();

function SDK() {
  // 登陆接口
  this.clientId = nuid.next();
  this.Login = function Login(req) {
    var option = {
      username: '',
      password: '',
      force: true
    }
    for (var keyName in req) {
      option[keyName] = req[keyName];
    }
    option.password = "md5#" + md5(option.password);
    option.clientId = this.clientId;
    return new Promise((resolve, reject) => {
      api.DisConnect();
      this.conn = api.CreatConnect({
        reconnect: false,
        url: hostname
      }).then(res => {
        if (res === 'success') {
          api.onRequest("$method.login.auth.cmd", JSON.stringify(option), null, this.clientId, msg => {
            resolve(msg);
          })
        } else {
          reject('connect ws fail!');
        }
      });
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })

  };

  /*------------------------拉流相关接口-开始--------------------------------- */
  // 获取最大拉流数量
  this.GetMaxStreamPullCnt = function () {
    return new Promise((resolve, reject) => {
      api.onRequest("$method.$get.zhishen.streamPull.info", null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     maxPullCh: 6
    //   }
    // }
  }
  // 获取第N路的拉流配置
  this.GetStreamPullCfgByIndex = function (index) {
    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$get.zhishen.streamPull.ch${index}.cfg`, null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     url: 'RTMP_URL',
    //     reconnect: true, // 是否自动重连
    //   }
    // }
  }
  // 设置第N路的拉流配置
  this.SetStreamPullCfgByIndex = function (index, cfg) {
    var option = {
      url: '', // 码流源的URL地址
      reconnect: true, // 是否自动重连
    }
    for (var keyName in cfg) {
      option[keyName] = cfg[keyName];
    }

    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$set.zhishen.streamPull.ch${index}.cfg`, JSON.stringify(option), null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    // }
  }
  // 获取第N路流的连接状态
  this.GetStreamPullStatusByIndex = function (index) {
    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$get.zhishen.streamPull.ch${index}.status`, null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     status: 'idle', // idle表示空闲，默认状态，linking表示正在连接，linked表示已接入互联网拉流，overtime表示接入拉流后，因各种原因断流且断流超过1分钟
    //   }
    // }
  }
  /*------------------------拉流相关接口-结束--------------------------------- */


  /*------------------------推流相关接口-开始--------------------------------- */
  // 获取最大推流数量
  this.GetMaxStreamPushCnt = function () {
    return new Promise((resolve, reject) => {
      api.onRequest("$method.$get.zhishen.streamPush.info", null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     maxPullCh: 6
    //   }
    // }
  }
  // 获取第N路的推流配置
  this.GetStreamPushCfgByIndex = function (index) {
    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$get.zhishen.streamPush.ch${index}.dstCfg`, null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     url: 'RTMP_URL',
    //     reconnect: true, // 是否自动重连
    //   }
    // }
  }
  // 设置第N路的推流配置
  this.SetStreamPushCfgByIndex = function (index, cfg) {
    var option = {
      url: '', // 码流源的URL地址
      pushAudio: true, // 是否推送音频码流
      pushVideo: true // 是否推送视频码流
    }
    for (var keyName in cfg) {
      option[keyName] = cfg[keyName];
    }
    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$set.zhishen.streamPush.ch${index}.dstCfg`, JSON.stringify(option), null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    // }
  }
  // 获取第N路流的连接状态
  this.GetStreamPushStatusByIndex = function (index) {
    return new Promise((resolve, reject) => {
      api.onRequest(`$method.$get.zhishen.streamPush.ch${index}.status`, null, null, null, msg => {
        resolve(msg);
      })
      setTimeout(() => {
        reject('timeout');
      }, timeout)
    })
    // 返回示例：
    // {
    //   code: 0, // 0表示请求成功， 其他数字表示请求失败
    //   data: {
    //     status: 'idle', // idle表示空闲，默认状态，linking表示正在连接，linked表示已接入互联网拉流，overtime表示接入拉流后，因各种原因断流且断流超过1分钟
    //   }
    // }
  }
  /*------------------------推流相关接口-结束--------------------------------- */
}

export var sdk = new SDK();
